{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Linear_Mixed_Effects_Models.ipynb",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": [],
      "toc_visible": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "metadata": {
        "id": "ZkIHkjDWgySK",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "##### Copyright 2018 The TensorFlow Authors.\n",
        "\n",
        "Licensed under the Apache License, Version 2.0 (the \"License\");"
      ]
    },
    {
      "metadata": {
        "id": "G5eriUZ9g1Ia",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "iCUZvZvBB7VD",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Linear Mixed Effects Models\n",
        "\n",
        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/probability/blob/master/tensorflow_probability/examples/jupyter_notebooks/Linear_Mixed_Effects_Models.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://github.com/tensorflow/probability/blob/master/tensorflow_probability/examples/jupyter_notebooks/Linear_Mixed_Effects_Models.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />View source on GitHub</a>\n",
        "  </td>\n",
        "</table>\n"
      ]
    },
    {
      "metadata": {
        "id": "yDCkuCjq2DfW",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "A linear mixed effects model is a simple approach for modeling structured linear relationships (Harville, 1997; Laird and Ware, 1982). Each data point consists of inputs of varying type—categorized into groups—and a real-valued output. A linear mixed effects model is a _hierarchical model_: it shares statistical strength across groups in order to improve inferences about any individual data point.\n",
        "\n",
        "In this tutorial, we demonstrate linear mixed effects models with a real-world example in TensorFlow Probability. We'll use the Edward2 (`tfp.edward2`) and Markov Chain Monte Carlo (`tfp.mcmc`) modules."
      ]
    },
    {
      "metadata": {
        "id": "2brwVZwEB7VF",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "%matplotlib inline\n",
        "from __future__ import absolute_import\n",
        "from __future__ import division\n",
        "from __future__ import print_function\n",
        "\n",
        "import csv\n",
        "import IPython\n",
        "import matplotlib.pyplot as plt\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "import requests\n",
        "import tensorflow as tf\n",
        "import tensorflow_probability as tfp\n",
        "import warnings\n",
        "\n",
        "from tensorflow_probability import edward2 as ed\n",
        "\n",
        "plt.style.use('ggplot')"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "eikJTmPgB7VJ",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Data\n",
        "\n",
        "We use the `InstEval` data set from the popular [`lme4` package in R](https://CRAN.R-project.org/package=lme4) (Bates et al., 2015). It is a data set of courses and their evaluation ratings. Each course includes metadata such as `students`, `instructors`, and `departments`, and the response variable of interest is the evaluation rating."
      ]
    },
    {
      "metadata": {
        "id": "lZ8OfS3cDMeG",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "def load_insteval():\n",
        "  \"\"\"Loads the InstEval data set.\n",
        "\n",
        "  It contains 73,421 university lecture evaluations by students at ETH\n",
        "  Zurich with a total of 2,972 students, 2,160 professors and\n",
        "  lecturers, and several student, lecture, and lecturer attributes.\n",
        "  Implementation is built from the `observations` Python package.\n",
        "\n",
        "  Returns:\n",
        "    Tuple of np.darray `x_train` with 73,421 rows and 7 columns and\n",
        "    dictionary `metadata` of column headers (feature names).\n",
        "  \"\"\"\n",
        "  url = ('https://raw.github.com/vincentarelbundock/Rdatasets/master/csv/'\n",
        "         'lme4/InstEval.csv')\n",
        "  with requests.Session() as s:\n",
        "    download = s.get(url)\n",
        "    f = download.content.decode().splitlines()\n",
        "\n",
        "  iterator = csv.reader(f)\n",
        "  columns = next(iterator)[1:]\n",
        "  x_train = np.array([row[1:] for row in iterator], dtype=np.int)\n",
        "  metadata = {'columns': columns}\n",
        "  return x_train, metadata"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "Um0EhvaDQcVI",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "We load and preprocess the data set. We hold out 20% of the data so we can evaluate our fitted model on unseen data points. Below we visualize the first few rows."
      ]
    },
    {
      "metadata": {
        "id": "YY_VbNt6fkcp",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        },
        "outputId": "7cd7b2ab-7a3e-4d77-b32d-02315cf930fa"
      },
      "cell_type": "code",
      "source": [
        "data, metadata = load_insteval()\n",
        "data = pd.DataFrame(data, columns=metadata['columns'])\n",
        "data = data.rename(columns={'s': 'students',\n",
        "                            'd': 'instructors',\n",
        "                            'dept': 'departments',\n",
        "                            'y': 'ratings'})\n",
        "data['students'] -= 1  # start index by 0\n",
        "# Remap categories to start from 0 and end at max(category).\n",
        "data['instructors'] = data['instructors'].astype('category').cat.codes\n",
        "data['departments'] = data['departments'].astype('category').cat.codes\n",
        "\n",
        "train = data.sample(frac=0.8)\n",
        "test = data.drop(train.index)\n",
        "\n",
        "train.head()"
      ],
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>students</th>\n",
              "      <th>instructors</th>\n",
              "      <th>studage</th>\n",
              "      <th>lectage</th>\n",
              "      <th>service</th>\n",
              "      <th>departments</th>\n",
              "      <th>ratings</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>40736</th>\n",
              "      <td>1651</td>\n",
              "      <td>17</td>\n",
              "      <td>4</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>12</td>\n",
              "      <td>5</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>23953</th>\n",
              "      <td>967</td>\n",
              "      <td>226</td>\n",
              "      <td>6</td>\n",
              "      <td>2</td>\n",
              "      <td>0</td>\n",
              "      <td>11</td>\n",
              "      <td>4</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4252</th>\n",
              "      <td>159</td>\n",
              "      <td>897</td>\n",
              "      <td>6</td>\n",
              "      <td>5</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>5</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>64541</th>\n",
              "      <td>2616</td>\n",
              "      <td>561</td>\n",
              "      <td>8</td>\n",
              "      <td>6</td>\n",
              "      <td>1</td>\n",
              "      <td>7</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>59310</th>\n",
              "      <td>2404</td>\n",
              "      <td>838</td>\n",
              "      <td>4</td>\n",
              "      <td>2</td>\n",
              "      <td>1</td>\n",
              "      <td>1</td>\n",
              "      <td>3</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "       students  instructors  studage  lectage  service  departments  ratings\n",
              "40736      1651           17        4        1        1           12        5\n",
              "23953       967          226        6        2        0           11        4\n",
              "4252        159          897        6        5        1            1        5\n",
              "64541      2616          561        8        6        1            7        1\n",
              "59310      2404          838        4        2        1            1        3"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 5
        }
      ]
    },
    {
      "metadata": {
        "id": "qWttG6OaVFMO",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "We set up the data set in terms of a `features` dictionary of inputs and a `labels` output corresponding to the ratings. Each feature is encoded as an integer and each label (evaluation rating) is encoded as a floating point number."
      ]
    },
    {
      "metadata": {
        "id": "NzfVQJN9B7VQ",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "get_value = lambda dataframe, key, dtype: dataframe[key].values.astype(dtype)\n",
        "features_train = {\n",
        "    k: get_value(train, key=k, dtype=np.int32)\n",
        "    for k in ['students', 'instructors', 'departments', 'service']}\n",
        "labels_train = get_value(train, key='ratings', dtype=np.float32)\n",
        "\n",
        "features_test = {k: get_value(test, key=k, dtype=np.int32)\n",
        "                 for k in ['students', 'instructors', 'departments', 'service']}\n",
        "labels_test = get_value(test, key='ratings', dtype=np.float32)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "80ylfxWtB7VT",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 85
        },
        "outputId": "37788a45-278d-4f23-bec3-f849e6ced263"
      },
      "cell_type": "code",
      "source": [
        "num_students = max(features_train['students']) + 1\n",
        "num_instructors = max(features_train['instructors']) + 1\n",
        "num_departments = max(features_train['departments']) + 1\n",
        "num_observations = train.shape[0]\n",
        "\n",
        "print(\"Number of students:\", num_students)\n",
        "print(\"Number of instructors:\", num_instructors)\n",
        "print(\"Number of departments:\", num_departments)\n",
        "print(\"Number of observations:\", num_observations)"
      ],
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Number of students: 2972\n",
            "Number of instructors: 1128\n",
            "Number of departments: 14\n",
            "Number of observations: 58737\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "jMRMLuWwB7VX",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Model\n",
        "\n",
        "A typical linear model assumes independence, where any pair of data points has a constant linear relationship. In the `InstEval` data set, observations arise in groups each of which may have varying slopes and intercepts. Linear mixed effects models, also known as hierarchical linear models or multilevel linear models, capture this phenomenon (Gelman & Hill, 2006).\n",
        "\n",
        "Examples of this phenomenon include:\n",
        "\n",
        "+ __Students__. Observations from a student are not independent: some students may systematically give low (or high) lecture ratings.\n",
        "+ __Instructors__. Observations from an instructor are not independent: we expect good teachers to generally have good ratings and bad teachers to generally have bad ratings.\n",
        "+ __Departments__. Observations from a department are not independent: certain departments may generally have dry material or stricter grading and thus be rated lower than others.\n",
        "\n",
        "To capture this, recall that for a data set of $N\\times D$ features $\\mathbf{X}$ and $N$ labels $\\mathbf{y}$, linear regression posits the model\n",
        "\n",
        "\\begin{equation*}\n",
        "\\mathbf{y} = \\mathbf{X}\\beta + \\alpha + \\epsilon,\n",
        "\\end{equation*}\n",
        "\n",
        "where there is a slope vector $\\beta\\in\\mathbb{R}^D$, intercept $\\alpha\\in\\mathbb{R}$, and random noise $\\epsilon\\sim\\text{Normal}(\\mathbf{0}, \\mathbf{I})$. We say that $\\beta$ and $\\alpha$ are \"fixed effects\": they are effects held constant across the population of data points $(x, y)$. An equivalent formulation of the equation as a likelihood is $\\mathbf{y} \\sim \\text{Normal}(\\mathbf{X}\\beta + \\alpha, \\mathbf{I})$. This likelihood is maximized during inference in order to find point estimates of $\\beta$ and $\\alpha$ that fit the data.\n",
        "\n",
        "A linear mixed effects model extends linear regression as\n",
        "\n",
        "\\begin{align*}\n",
        "\\eta &\\sim \\text{Normal}(\\mathbf{0}, \\sigma^2 \\mathbf{I}), \\\\\n",
        "\\mathbf{y} &= \\mathbf{X}\\beta + \\mathbf{Z}\\eta + \\alpha + \\epsilon.\n",
        "\\end{align*}\n",
        "\n",
        "where there is still a slope vector $\\beta\\in\\mathbb{R}^P$, intercept $\\alpha\\in\\mathbb{R}$, and random noise $\\epsilon\\sim\\text{Normal}(\\mathbf{0}, \\mathbf{I})$. In addition, there is a term $\\mathbf{Z}\\eta$, where $\\mathbf{Z}$ is a features matrix and $\\eta\\in\\mathbb{R}^Q$ is a vector of random slopes; $\\eta$ is normally distributed with variance component parameter $\\sigma^2$. $\\mathbf{Z}$ is formed by partitioning the original $N\\times D$ features matrix in terms of a new $N\\times P$ matrix $\\mathbf{X}$ and $N\\times Q$ matrix $\\mathbf{Z}$, where $P + Q=D$: this partition allows us to model the features separately using the fixed effects $\\beta$ and the latent variable $\\eta$ respectively.\n",
        "\n",
        "We say the latent variables $\\eta$ are \"random effects\": they are effects that vary across the population (although they may be constant across subpopulations). In particular, because the random effects $\\eta$ have mean 0, the data label's mean is captured by $\\mathbf{X}\\beta + \\alpha$. The random effects component $\\mathbf{Z}\\eta$ captures variations in the data: for example, \"Instructor \\#54 is rated 1.4 points higher than the mean.\""
      ]
    },
    {
      "metadata": {
        "id": "7B6ROTDQdTjH",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "In this tutorial, we posit the following effects:\n",
        "\n",
        "+ Fixed effects: `service`. `service` is a binary covariate corresponding to whether the course belongs to the instructor's main department. No matter how much additional data we collect, it can only take on values $0$ and $1$.\n",
        "+ Random effects: `students`, `instructors`, and `departments`. Given more observations from the population of course evaluation ratings, we may be looking at new students, teachers, or departments.\n",
        "\n",
        "In the syntax of R's lme4 package (Bates et al., 2015), the model can be summarized as\n",
        "\n",
        "```\n",
        "ratings ~ service + (1|students) + (1|instructors) + (1|departments) + 1\n",
        "```\n",
        "where `x` denotes a fixed effect,`(1|x)` denotes a random effect for `x`, and `1` denotes an intercept term.\n",
        "\n",
        "We implement this model below as an Edward program."
      ]
    },
    {
      "metadata": {
        "id": "12nqmEIsB7VY",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "def linear_mixed_effects_model(features):\n",
        "  # Set up fixed effects and other parameters.\n",
        "  intercept = tf.get_variable(\"intercept\", [])  # alpha in eq\n",
        "  effect_service = tf.get_variable(\"effect_service\", [])  # beta in eq\n",
        "  stddev_students = tf.exp(\n",
        "      tf.get_variable(\"stddev_unconstrained_students\", []))  # sigma in eq\n",
        "  stddev_instructors = tf.exp(\n",
        "      tf.get_variable(\"stddev_unconstrained_instructors\", [])) # sigma in eq\n",
        "  stddev_departments = tf.exp(\n",
        "      tf.get_variable(\"stddev_unconstrained_departments\", [])) # sigma in eq\n",
        "\n",
        "  # Set up random effects.\n",
        "  effect_students = ed.MultivariateNormalDiag(\n",
        "      loc=tf.zeros(num_students),\n",
        "      scale_identity_multiplier=stddev_students,\n",
        "      name=\"effect_students\")\n",
        "  effect_instructors = ed.MultivariateNormalDiag(\n",
        "      loc=tf.zeros(num_instructors),\n",
        "      scale_identity_multiplier=stddev_instructors,\n",
        "      name=\"effect_instructors\")\n",
        "  effect_departments = ed.MultivariateNormalDiag(\n",
        "      loc=tf.zeros(num_departments),\n",
        "      scale_identity_multiplier=stddev_departments,\n",
        "      name=\"effect_departments\")\n",
        "\n",
        "  # Set up likelihood given fixed and random effects.\n",
        "  # Note we use `tf.gather` instead of matrix-multiplying a design matrix of\n",
        "  # one-hot vectors. The latter is memory-intensive if there are many groups.\n",
        "  ratings = ed.Normal(\n",
        "      loc=(effect_service * features[\"service\"] +\n",
        "           tf.gather(effect_students, features[\"students\"]) +\n",
        "           tf.gather(effect_instructors, features[\"instructors\"]) +\n",
        "           tf.gather(effect_departments, features[\"departments\"]) +\n",
        "           intercept),\n",
        "      scale=1.,\n",
        "      name=\"ratings\")\n",
        "  return ratings\n",
        "\n",
        "# Wrap model in a template. All calls to the model template will use the same\n",
        "# TensorFlow variables.\n",
        "model_template = tf.make_template(\"model\", linear_mixed_effects_model)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "3G_0t3jiZps2",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "As an Edward program, we can also visualize the model's structure in terms of its computational graph. This graph encodes dataflow across the random variables in the program, making explicit their relationships in terms of a graphical model (Jordan, 2003).\n",
        "\n",
        "As a statistical tool, we might look at the graph in order to better see, for example, that `intercept` and `effect_service` are conditionally dependent given `ratings`; this may be harder to see from the source code if the program is written with classes, cross references across modules, and/or subroutines. As a computational tool, we might also notice latent variables flow into the `ratings` variable via `tf.gather` ops. This may be a bottleneck on certain hardware accelerators if indexing `Tensor`s is expensive; visualizing the graph makes this readily apparent.\n"
      ]
    },
    {
      "metadata": {
        "id": "ZQQZrTtBZww3",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 641
        },
        "outputId": "cdd8c5ee-5f49-4d9d-f0dc-ddd8e499bade"
      },
      "cell_type": "code",
      "source": [
        "def strip_consts(graph_def, max_const_size=32):\n",
        "  \"\"\"Strip large constant values from graph_def.\"\"\"\n",
        "  strip_def = tf.GraphDef()\n",
        "  for n0 in graph_def.node:\n",
        "    n = strip_def.node.add()\n",
        "    n.MergeFrom(n0)\n",
        "    if n.op == 'Const':\n",
        "      tensor = n.attr['value'].tensor\n",
        "      size = len(tensor.tensor_content)\n",
        "      if size > max_const_size:\n",
        "        tensor.tensor_content = bytes(\"<stripped %d bytes>\"%size, 'utf-8')\n",
        "  return strip_def\n",
        "\n",
        "def draw_graph(model, *args, **kwargs):\n",
        "  \"\"\"Visualize TensorFlow graph.\"\"\"\n",
        "  graph = tf.Graph()\n",
        "  with graph.as_default():\n",
        "    model(*args, **kwargs)\n",
        "  graph_def = graph.as_graph_def()\n",
        "  strip_def = strip_consts(graph_def, max_const_size=32)\n",
        "  code = \"\"\"\n",
        "      <script>\n",
        "        function load() {{\n",
        "          document.getElementById(\"{id}\").pbtxt = {data};\n",
        "        }}\n",
        "      </script>\n",
        "      <link rel=\"import\" href=\"https://tensorboard.appspot.com/tf-graph-basic.build.html\" onload=load()>\n",
        "      <div style=\"height:600px\">\n",
        "        <tf-graph-basic id=\"{id}\"></tf-graph-basic>\n",
        "      </div>\n",
        "  \"\"\".format(data=repr(str(strip_def)), id='graph'+str(np.random.rand()))\n",
        "\n",
        "  iframe = \"\"\"\n",
        "      <iframe seamless style=\"width:1200px;height:620px;border:0\" srcdoc=\"{}\"></iframe>\n",
        "  \"\"\".format(code.replace('\"', '&quot;'))\n",
        "  IPython.display.display(IPython.display.HTML(iframe))\n",
        "\n",
        "\n",
        "draw_graph(linear_mixed_effects_model, features_train)"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/html": [
              "\n",
              "      <iframe seamless style=\"width:1200px;height:620px;border:0\" srcdoc=\"\n",
              "      <script>\n",
              "        function load() {\n",
              "          document.getElementById(&quot;graph0.34529891728490614&quot;).pbtxt = 'node {\\n  name: &quot;intercept/Initializer/random_uniform/shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@intercept&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;intercept/Initializer/random_uniform/min&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@intercept&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: -1.7320507764816284\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;intercept/Initializer/random_uniform/max&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@intercept&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.7320507764816284\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;intercept/Initializer/random_uniform/RandomUniform&quot;\\n  op: &quot;RandomUniform&quot;\\n  input: &quot;intercept/Initializer/random_uniform/shape&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@intercept&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;seed&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;seed2&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;intercept/Initializer/random_uniform/sub&quot;\\n  op: &quot;Sub&quot;\\n  input: &quot;intercept/Initializer/random_uniform/max&quot;\\n  input: &quot;intercept/Initializer/random_uniform/min&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@intercept&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;intercept/Initializer/random_uniform/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;intercept/Initializer/random_uniform/RandomUniform&quot;\\n  input: &quot;intercept/Initializer/random_uniform/sub&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@intercept&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;intercept/Initializer/random_uniform&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;intercept/Initializer/random_uniform/mul&quot;\\n  input: &quot;intercept/Initializer/random_uniform/min&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@intercept&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;intercept&quot;\\n  op: &quot;VariableV2&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@intercept&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;container&quot;\\n    value {\\n      s: &quot;&quot;\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;shape&quot;\\n    value {\\n      shape {\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;shared_name&quot;\\n    value {\\n      s: &quot;&quot;\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;intercept/Assign&quot;\\n  op: &quot;Assign&quot;\\n  input: &quot;intercept&quot;\\n  input: &quot;intercept/Initializer/random_uniform&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@intercept&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;use_locking&quot;\\n    value {\\n      b: true\\n    }\\n  }\\n  attr {\\n    key: &quot;validate_shape&quot;\\n    value {\\n      b: true\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;intercept/read&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;intercept&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@intercept&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_service/Initializer/random_uniform/shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@effect_service&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_service/Initializer/random_uniform/min&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@effect_service&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: -1.7320507764816284\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_service/Initializer/random_uniform/max&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@effect_service&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.7320507764816284\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_service/Initializer/random_uniform/RandomUniform&quot;\\n  op: &quot;RandomUniform&quot;\\n  input: &quot;effect_service/Initializer/random_uniform/shape&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@effect_service&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;seed&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;seed2&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_service/Initializer/random_uniform/sub&quot;\\n  op: &quot;Sub&quot;\\n  input: &quot;effect_service/Initializer/random_uniform/max&quot;\\n  input: &quot;effect_service/Initializer/random_uniform/min&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@effect_service&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_service/Initializer/random_uniform/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;effect_service/Initializer/random_uniform/RandomUniform&quot;\\n  input: &quot;effect_service/Initializer/random_uniform/sub&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@effect_service&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_service/Initializer/random_uniform&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;effect_service/Initializer/random_uniform/mul&quot;\\n  input: &quot;effect_service/Initializer/random_uniform/min&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@effect_service&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_service&quot;\\n  op: &quot;VariableV2&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@effect_service&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;container&quot;\\n    value {\\n      s: &quot;&quot;\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;shape&quot;\\n    value {\\n      shape {\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;shared_name&quot;\\n    value {\\n      s: &quot;&quot;\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_service/Assign&quot;\\n  op: &quot;Assign&quot;\\n  input: &quot;effect_service&quot;\\n  input: &quot;effect_service/Initializer/random_uniform&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@effect_service&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;use_locking&quot;\\n    value {\\n      b: true\\n    }\\n  }\\n  attr {\\n    key: &quot;validate_shape&quot;\\n    value {\\n      b: true\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_service/read&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;effect_service&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@effect_service&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_students/Initializer/random_uniform/shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_students&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_students/Initializer/random_uniform/min&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_students&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: -1.7320507764816284\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_students/Initializer/random_uniform/max&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_students&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.7320507764816284\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_students/Initializer/random_uniform/RandomUniform&quot;\\n  op: &quot;RandomUniform&quot;\\n  input: &quot;stddev_unconstrained_students/Initializer/random_uniform/shape&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_students&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;seed&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;seed2&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_students/Initializer/random_uniform/sub&quot;\\n  op: &quot;Sub&quot;\\n  input: &quot;stddev_unconstrained_students/Initializer/random_uniform/max&quot;\\n  input: &quot;stddev_unconstrained_students/Initializer/random_uniform/min&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_students&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_students/Initializer/random_uniform/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;stddev_unconstrained_students/Initializer/random_uniform/RandomUniform&quot;\\n  input: &quot;stddev_unconstrained_students/Initializer/random_uniform/sub&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_students&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_students/Initializer/random_uniform&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;stddev_unconstrained_students/Initializer/random_uniform/mul&quot;\\n  input: &quot;stddev_unconstrained_students/Initializer/random_uniform/min&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_students&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_students&quot;\\n  op: &quot;VariableV2&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_students&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;container&quot;\\n    value {\\n      s: &quot;&quot;\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;shape&quot;\\n    value {\\n      shape {\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;shared_name&quot;\\n    value {\\n      s: &quot;&quot;\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_students/Assign&quot;\\n  op: &quot;Assign&quot;\\n  input: &quot;stddev_unconstrained_students&quot;\\n  input: &quot;stddev_unconstrained_students/Initializer/random_uniform&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_students&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;use_locking&quot;\\n    value {\\n      b: true\\n    }\\n  }\\n  attr {\\n    key: &quot;validate_shape&quot;\\n    value {\\n      b: true\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_students/read&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;stddev_unconstrained_students&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_students&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Exp&quot;\\n  op: &quot;Exp&quot;\\n  input: &quot;stddev_unconstrained_students/read&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_instructors&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/min&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_instructors&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: -1.7320507764816284\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/max&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_instructors&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.7320507764816284\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/RandomUniform&quot;\\n  op: &quot;RandomUniform&quot;\\n  input: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/shape&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_instructors&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;seed&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;seed2&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/sub&quot;\\n  op: &quot;Sub&quot;\\n  input: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/max&quot;\\n  input: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/min&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_instructors&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/RandomUniform&quot;\\n  input: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/sub&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_instructors&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_instructors/Initializer/random_uniform&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/mul&quot;\\n  input: &quot;stddev_unconstrained_instructors/Initializer/random_uniform/min&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_instructors&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_instructors&quot;\\n  op: &quot;VariableV2&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_instructors&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;container&quot;\\n    value {\\n      s: &quot;&quot;\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;shape&quot;\\n    value {\\n      shape {\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;shared_name&quot;\\n    value {\\n      s: &quot;&quot;\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_instructors/Assign&quot;\\n  op: &quot;Assign&quot;\\n  input: &quot;stddev_unconstrained_instructors&quot;\\n  input: &quot;stddev_unconstrained_instructors/Initializer/random_uniform&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_instructors&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;use_locking&quot;\\n    value {\\n      b: true\\n    }\\n  }\\n  attr {\\n    key: &quot;validate_shape&quot;\\n    value {\\n      b: true\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_instructors/read&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;stddev_unconstrained_instructors&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_instructors&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Exp_1&quot;\\n  op: &quot;Exp&quot;\\n  input: &quot;stddev_unconstrained_instructors/read&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_departments/Initializer/random_uniform/shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_departments&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_departments/Initializer/random_uniform/min&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_departments&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: -1.7320507764816284\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_departments/Initializer/random_uniform/max&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_departments&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.7320507764816284\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_departments/Initializer/random_uniform/RandomUniform&quot;\\n  op: &quot;RandomUniform&quot;\\n  input: &quot;stddev_unconstrained_departments/Initializer/random_uniform/shape&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_departments&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;seed&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;seed2&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_departments/Initializer/random_uniform/sub&quot;\\n  op: &quot;Sub&quot;\\n  input: &quot;stddev_unconstrained_departments/Initializer/random_uniform/max&quot;\\n  input: &quot;stddev_unconstrained_departments/Initializer/random_uniform/min&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_departments&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_departments/Initializer/random_uniform/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;stddev_unconstrained_departments/Initializer/random_uniform/RandomUniform&quot;\\n  input: &quot;stddev_unconstrained_departments/Initializer/random_uniform/sub&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_departments&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_departments/Initializer/random_uniform&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;stddev_unconstrained_departments/Initializer/random_uniform/mul&quot;\\n  input: &quot;stddev_unconstrained_departments/Initializer/random_uniform/min&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_departments&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_departments&quot;\\n  op: &quot;VariableV2&quot;\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_departments&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;container&quot;\\n    value {\\n      s: &quot;&quot;\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;shape&quot;\\n    value {\\n      shape {\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;shared_name&quot;\\n    value {\\n      s: &quot;&quot;\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_departments/Assign&quot;\\n  op: &quot;Assign&quot;\\n  input: &quot;stddev_unconstrained_departments&quot;\\n  input: &quot;stddev_unconstrained_departments/Initializer/random_uniform&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_departments&quot;\\n      }\\n    }\\n  }\\n  attr {\\n    key: &quot;use_locking&quot;\\n    value {\\n      b: true\\n    }\\n  }\\n  attr {\\n    key: &quot;validate_shape&quot;\\n    value {\\n      b: true\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;stddev_unconstrained_departments/read&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;stddev_unconstrained_departments&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;_class&quot;\\n    value {\\n      list {\\n        s: &quot;loc:@stddev_unconstrained_departments&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Exp_2&quot;\\n  op: &quot;Exp&quot;\\n  input: &quot;stddev_unconstrained_departments/read&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;zeros/shape_as_tensor&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 2972\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;zeros/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 0.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;zeros&quot;\\n  op: &quot;Fill&quot;\\n  input: &quot;zeros/shape_as_tensor&quot;\\n  input: &quot;zeros/Const&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;index_type&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims/dim&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: -1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims&quot;\\n  op: &quot;ExpandDims&quot;\\n  input: &quot;Exp&quot;\\n  input: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims/dim&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tdim&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims_1/dim&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: -1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims_1&quot;\\n  op: &quot;ExpandDims&quot;\\n  input: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims&quot;\\n  input: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims_1/dim&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tdim&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/Abs&quot;\\n  op: &quot;Abs&quot;\\n  input: &quot;Exp&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/num_rows&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 2972\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/Cast&quot;\\n  op: &quot;Cast&quot;\\n  input: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/num_rows&quot;\\n  attr {\\n    key: &quot;DstT&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;SrcT&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Truncate&quot;\\n    value {\\n      b: false\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/Cast_1&quot;\\n  op: &quot;Cast&quot;\\n  input: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/num_rows&quot;\\n  attr {\\n    key: &quot;DstT&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;SrcT&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Truncate&quot;\\n    value {\\n      b: false\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/shapes_from_loc_and_scale/LinearOperatorScaledIdentity/range_dimension_tensor/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 2972\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/shapes_from_loc_and_scale/LinearOperatorScaledIdentity_1/batch_shape_tensor/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/shapes_from_loc_and_scale/loc_batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;zeros_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 0.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ones&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/loc&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;zeros_1&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/scale&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;ones&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;affine_linear_operator/init/DistributionShape/init/batch_ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;affine_linear_operator/init/DistributionShape/init/event_ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/zero&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/empty&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/is_scalar_batch/is_scalar_batch&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_2&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_3&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_4&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_5&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/is_scalar_event/is_scalar_event&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/event_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 2972\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_6&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_7&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_8&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_9&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_10&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_11&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_12&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_13&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_14&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_15&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/is_scalar_batch_1/is_scalar_batch&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_16&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_17&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/Const_18&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sub/x&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sub&quot;\\n  op: &quot;Sub&quot;\\n  input: &quot;effect_students/sub/x&quot;\\n  input: &quot;effect_students/Const_18&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/range/limit&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/range/delta&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/range&quot;\\n  op: &quot;Range&quot;\\n  input: &quot;effect_students/sub&quot;\\n  input: &quot;effect_students/range/limit&quot;\\n  input: &quot;effect_students/range/delta&quot;\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;sample_shape_tensor/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/Const_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000\\\\234\\\\013\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/batch_shape_tensor/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/concat/values_0&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 2972\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;Normal/sample/concat/values_0&quot;\\n  input: &quot;Normal/batch_shape_tensor/batch_shape&quot;\\n  input: &quot;Normal/sample/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 2\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/random_normal/mean&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 0.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/random_normal/stddev&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/random_normal/RandomStandardNormal&quot;\\n  op: &quot;RandomStandardNormal&quot;\\n  input: &quot;Normal/sample/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;seed&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;seed2&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/random_normal/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;Normal/sample/random_normal/RandomStandardNormal&quot;\\n  input: &quot;Normal/sample/random_normal/stddev&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/random_normal&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;Normal/sample/random_normal/mul&quot;\\n  input: &quot;Normal/sample/random_normal/mean&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;Normal/sample/random_normal&quot;\\n  input: &quot;Normal/scale&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/add&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;Normal/sample/mul&quot;\\n  input: &quot;Normal/loc&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/Shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 2972\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/strided_slice/stack&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/strided_slice/stack_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/strided_slice/stack_2&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/strided_slice&quot;\\n  op: &quot;StridedSlice&quot;\\n  input: &quot;Normal/sample/Shape&quot;\\n  input: &quot;Normal/sample/strided_slice/stack&quot;\\n  input: &quot;Normal/sample/strided_slice/stack_1&quot;\\n  input: &quot;Normal/sample/strided_slice/stack_2&quot;\\n  attr {\\n    key: &quot;Index&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;begin_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;ellipsis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;end_mask&quot;\\n    value {\\n      i: 1\\n    }\\n  }\\n  attr {\\n    key: &quot;new_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;shrink_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/concat_1/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/concat_1&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;effect_students/sample/Const_1&quot;\\n  input: &quot;Normal/sample/strided_slice&quot;\\n  input: &quot;Normal/sample/concat_1/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 2\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal/sample/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;Normal/sample/add&quot;\\n  input: &quot;Normal/sample/concat_1&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/Shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000\\\\234\\\\013\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/strided_slice/stack&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/strided_slice/stack_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/strided_slice/stack_2&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/strided_slice&quot;\\n  op: &quot;StridedSlice&quot;\\n  input: &quot;effect_students/sample/Shape&quot;\\n  input: &quot;effect_students/sample/strided_slice/stack&quot;\\n  input: &quot;effect_students/sample/strided_slice/stack_1&quot;\\n  input: &quot;effect_students/sample/strided_slice/stack_2&quot;\\n  attr {\\n    key: &quot;Index&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;begin_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;ellipsis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;end_mask&quot;\\n    value {\\n      i: 1\\n    }\\n  }\\n  attr {\\n    key: &quot;new_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;shrink_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;sample_shape_tensor/Const&quot;\\n  input: &quot;effect_students/sample/strided_slice&quot;\\n  input: &quot;effect_students/sample/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 2\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;Normal/sample/Reshape&quot;\\n  input: &quot;effect_students/sample/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/DistributionShape/get_shape/DistributionShape/get_shape/ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/DistributionShape/get_shape/sample_ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/zero&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/sample_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/event_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 2972\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/pick_vector/cond&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat/values_0&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: -1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat/values_0&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/batch_shape&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/event_shape&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 3\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;effect_students/sample/Reshape&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/shift&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: -1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/assert_integer/statically_determined_was_integer&quot;\\n  op: &quot;NoOp&quot;\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/transpose/perm&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/transpose&quot;\\n  op: &quot;Transpose&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/Reshape&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/transpose/perm&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tperm&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/LinearOperatorScaledIdentity/matmul/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/transpose&quot;\\n  input: &quot;effect_students/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims_1&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/shift&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/assert_integer/statically_determined_was_integer&quot;\\n  op: &quot;NoOp&quot;\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/transpose/perm&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/transpose&quot;\\n  op: &quot;Transpose&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/LinearOperatorScaledIdentity/matmul/mul&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/transpose/perm&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tperm&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/DistributionShape/get_shape/DistributionShape/get_shape/ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 2\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/DistributionShape/get_shape/sample_ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/zero&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/sample_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/event_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 2972\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/sample_shape&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/batch_shape&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/event_shape&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 3\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/transpose&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_students/sample/affine_linear_operator/forward/add&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/Reshape&quot;\\n  input: &quot;zeros&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;zeros_2/shape_as_tensor&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1128\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;zeros_2/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 0.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;zeros_2&quot;\\n  op: &quot;Fill&quot;\\n  input: &quot;zeros_2/shape_as_tensor&quot;\\n  input: &quot;zeros_2/Const&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;index_type&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims/dim&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: -1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims&quot;\\n  op: &quot;ExpandDims&quot;\\n  input: &quot;Exp_1&quot;\\n  input: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims/dim&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tdim&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims_1/dim&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: -1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims_1&quot;\\n  op: &quot;ExpandDims&quot;\\n  input: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims&quot;\\n  input: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims_1/dim&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tdim&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/Abs&quot;\\n  op: &quot;Abs&quot;\\n  input: &quot;Exp_1&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/num_rows&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1128\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/Cast&quot;\\n  op: &quot;Cast&quot;\\n  input: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/num_rows&quot;\\n  attr {\\n    key: &quot;DstT&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;SrcT&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Truncate&quot;\\n    value {\\n      b: false\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/Cast_1&quot;\\n  op: &quot;Cast&quot;\\n  input: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/num_rows&quot;\\n  attr {\\n    key: &quot;DstT&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;SrcT&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Truncate&quot;\\n    value {\\n      b: false\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/shapes_from_loc_and_scale/LinearOperatorScaledIdentity/range_dimension_tensor/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1128\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/shapes_from_loc_and_scale/LinearOperatorScaledIdentity_1/batch_shape_tensor/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/shapes_from_loc_and_scale/loc_batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;zeros_3&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 0.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ones_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/loc&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;zeros_3&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/scale&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;ones_1&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;affine_linear_operator_1/init/DistributionShape/init/batch_ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;affine_linear_operator_1/init/DistributionShape/init/event_ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/zero&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/empty&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/is_scalar_batch/is_scalar_batch&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_2&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_3&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_4&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_5&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/is_scalar_event/is_scalar_event&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/event_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1128\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_6&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_7&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_8&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_9&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_10&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_11&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_12&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_13&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_14&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_15&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/is_scalar_batch_1/is_scalar_batch&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_16&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_17&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/Const_18&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sub/x&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sub&quot;\\n  op: &quot;Sub&quot;\\n  input: &quot;effect_instructors/sub/x&quot;\\n  input: &quot;effect_instructors/Const_18&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/range/limit&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/range/delta&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/range&quot;\\n  op: &quot;Range&quot;\\n  input: &quot;effect_instructors/sub&quot;\\n  input: &quot;effect_instructors/range/limit&quot;\\n  input: &quot;effect_instructors/range/delta&quot;\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;sample_shape_tensor_1/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/Const_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000h\\\\004\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/batch_shape_tensor/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/concat/values_0&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1128\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;Normal_1/sample/concat/values_0&quot;\\n  input: &quot;Normal_1/batch_shape_tensor/batch_shape&quot;\\n  input: &quot;Normal_1/sample/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 2\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/random_normal/mean&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 0.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/random_normal/stddev&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/random_normal/RandomStandardNormal&quot;\\n  op: &quot;RandomStandardNormal&quot;\\n  input: &quot;Normal_1/sample/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;seed&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;seed2&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/random_normal/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;Normal_1/sample/random_normal/RandomStandardNormal&quot;\\n  input: &quot;Normal_1/sample/random_normal/stddev&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/random_normal&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;Normal_1/sample/random_normal/mul&quot;\\n  input: &quot;Normal_1/sample/random_normal/mean&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;Normal_1/sample/random_normal&quot;\\n  input: &quot;Normal_1/scale&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/add&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;Normal_1/sample/mul&quot;\\n  input: &quot;Normal_1/loc&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/Shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1128\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/strided_slice/stack&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/strided_slice/stack_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/strided_slice/stack_2&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/strided_slice&quot;\\n  op: &quot;StridedSlice&quot;\\n  input: &quot;Normal_1/sample/Shape&quot;\\n  input: &quot;Normal_1/sample/strided_slice/stack&quot;\\n  input: &quot;Normal_1/sample/strided_slice/stack_1&quot;\\n  input: &quot;Normal_1/sample/strided_slice/stack_2&quot;\\n  attr {\\n    key: &quot;Index&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;begin_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;ellipsis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;end_mask&quot;\\n    value {\\n      i: 1\\n    }\\n  }\\n  attr {\\n    key: &quot;new_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;shrink_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/concat_1/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/concat_1&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;effect_instructors/sample/Const_1&quot;\\n  input: &quot;Normal_1/sample/strided_slice&quot;\\n  input: &quot;Normal_1/sample/concat_1/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 2\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_1/sample/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;Normal_1/sample/add&quot;\\n  input: &quot;Normal_1/sample/concat_1&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/Shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000h\\\\004\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/strided_slice/stack&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/strided_slice/stack_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/strided_slice/stack_2&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/strided_slice&quot;\\n  op: &quot;StridedSlice&quot;\\n  input: &quot;effect_instructors/sample/Shape&quot;\\n  input: &quot;effect_instructors/sample/strided_slice/stack&quot;\\n  input: &quot;effect_instructors/sample/strided_slice/stack_1&quot;\\n  input: &quot;effect_instructors/sample/strided_slice/stack_2&quot;\\n  attr {\\n    key: &quot;Index&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;begin_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;ellipsis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;end_mask&quot;\\n    value {\\n      i: 1\\n    }\\n  }\\n  attr {\\n    key: &quot;new_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;shrink_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;sample_shape_tensor_1/Const&quot;\\n  input: &quot;effect_instructors/sample/strided_slice&quot;\\n  input: &quot;effect_instructors/sample/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 2\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;Normal_1/sample/Reshape&quot;\\n  input: &quot;effect_instructors/sample/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/DistributionShape/get_shape/DistributionShape/get_shape/ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/DistributionShape/get_shape/sample_ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/zero&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/sample_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/event_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1128\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/pick_vector/cond&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat/values_0&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: -1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat/values_0&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/batch_shape&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/event_shape&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 3\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;effect_instructors/sample/Reshape&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/shift&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: -1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/assert_integer/statically_determined_was_integer&quot;\\n  op: &quot;NoOp&quot;\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/transpose/perm&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/transpose&quot;\\n  op: &quot;Transpose&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/Reshape&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/transpose/perm&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tperm&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/LinearOperatorScaledIdentity/matmul/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/transpose&quot;\\n  input: &quot;effect_instructors/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims_1&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/shift&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/assert_integer/statically_determined_was_integer&quot;\\n  op: &quot;NoOp&quot;\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/transpose/perm&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/transpose&quot;\\n  op: &quot;Transpose&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/LinearOperatorScaledIdentity/matmul/mul&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/transpose/perm&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tperm&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/DistributionShape/get_shape/DistributionShape/get_shape/ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 2\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/DistributionShape/get_shape/sample_ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/zero&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/sample_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/event_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1128\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/sample_shape&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/batch_shape&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/event_shape&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 3\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/transpose&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_instructors/sample/affine_linear_operator/forward/add&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/Reshape&quot;\\n  input: &quot;zeros_2&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;zeros_4/shape_as_tensor&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 14\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;zeros_4/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 0.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;zeros_4&quot;\\n  op: &quot;Fill&quot;\\n  input: &quot;zeros_4/shape_as_tensor&quot;\\n  input: &quot;zeros_4/Const&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;index_type&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims/dim&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: -1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims&quot;\\n  op: &quot;ExpandDims&quot;\\n  input: &quot;Exp_2&quot;\\n  input: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims/dim&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tdim&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims_1/dim&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: -1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims_1&quot;\\n  op: &quot;ExpandDims&quot;\\n  input: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims&quot;\\n  input: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims_1/dim&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tdim&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/Abs&quot;\\n  op: &quot;Abs&quot;\\n  input: &quot;Exp_2&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/num_rows&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 14\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/Cast&quot;\\n  op: &quot;Cast&quot;\\n  input: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/num_rows&quot;\\n  attr {\\n    key: &quot;DstT&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;SrcT&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Truncate&quot;\\n    value {\\n      b: false\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/Cast_1&quot;\\n  op: &quot;Cast&quot;\\n  input: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/num_rows&quot;\\n  attr {\\n    key: &quot;DstT&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;SrcT&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Truncate&quot;\\n    value {\\n      b: false\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/shapes_from_loc_and_scale/LinearOperatorScaledIdentity/range_dimension_tensor/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 14\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/shapes_from_loc_and_scale/LinearOperatorScaledIdentity_1/batch_shape_tensor/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/shapes_from_loc_and_scale/loc_batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;zeros_5&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 0.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ones_2&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/loc&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;zeros_5&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/scale&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;ones_2&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;affine_linear_operator_2/init/DistributionShape/init/batch_ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;affine_linear_operator_2/init/DistributionShape/init/event_ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/zero&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/empty&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/is_scalar_batch/is_scalar_batch&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_2&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_3&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_4&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_5&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/is_scalar_event/is_scalar_event&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/event_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 14\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_6&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_7&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_8&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_9&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_10&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_11&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_12&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_13&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_14&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_15&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/is_scalar_batch_1/is_scalar_batch&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: true\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_16&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_17&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/Const_18&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sub/x&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sub&quot;\\n  op: &quot;Sub&quot;\\n  input: &quot;effect_departments/sub/x&quot;\\n  input: &quot;effect_departments/Const_18&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/range/limit&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/range/delta&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/range&quot;\\n  op: &quot;Range&quot;\\n  input: &quot;effect_departments/sub&quot;\\n  input: &quot;effect_departments/range/limit&quot;\\n  input: &quot;effect_departments/range/delta&quot;\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;sample_shape_tensor_2/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/Const_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000\\\\016\\\\000\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/batch_shape_tensor/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/concat/values_0&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 14\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;Normal_2/sample/concat/values_0&quot;\\n  input: &quot;Normal_2/batch_shape_tensor/batch_shape&quot;\\n  input: &quot;Normal_2/sample/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 2\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/random_normal/mean&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 0.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/random_normal/stddev&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/random_normal/RandomStandardNormal&quot;\\n  op: &quot;RandomStandardNormal&quot;\\n  input: &quot;Normal_2/sample/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;seed&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;seed2&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/random_normal/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;Normal_2/sample/random_normal/RandomStandardNormal&quot;\\n  input: &quot;Normal_2/sample/random_normal/stddev&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/random_normal&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;Normal_2/sample/random_normal/mul&quot;\\n  input: &quot;Normal_2/sample/random_normal/mean&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;Normal_2/sample/random_normal&quot;\\n  input: &quot;Normal_2/scale&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/add&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;Normal_2/sample/mul&quot;\\n  input: &quot;Normal_2/loc&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/Shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 14\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/strided_slice/stack&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/strided_slice/stack_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/strided_slice/stack_2&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/strided_slice&quot;\\n  op: &quot;StridedSlice&quot;\\n  input: &quot;Normal_2/sample/Shape&quot;\\n  input: &quot;Normal_2/sample/strided_slice/stack&quot;\\n  input: &quot;Normal_2/sample/strided_slice/stack_1&quot;\\n  input: &quot;Normal_2/sample/strided_slice/stack_2&quot;\\n  attr {\\n    key: &quot;Index&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;begin_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;ellipsis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;end_mask&quot;\\n    value {\\n      i: 1\\n    }\\n  }\\n  attr {\\n    key: &quot;new_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;shrink_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/concat_1/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/concat_1&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;effect_departments/sample/Const_1&quot;\\n  input: &quot;Normal_2/sample/strided_slice&quot;\\n  input: &quot;Normal_2/sample/concat_1/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 2\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;Normal_2/sample/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;Normal_2/sample/add&quot;\\n  input: &quot;Normal_2/sample/concat_1&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/Shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000\\\\016\\\\000\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/strided_slice/stack&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/strided_slice/stack_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/strided_slice/stack_2&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/strided_slice&quot;\\n  op: &quot;StridedSlice&quot;\\n  input: &quot;effect_departments/sample/Shape&quot;\\n  input: &quot;effect_departments/sample/strided_slice/stack&quot;\\n  input: &quot;effect_departments/sample/strided_slice/stack_1&quot;\\n  input: &quot;effect_departments/sample/strided_slice/stack_2&quot;\\n  attr {\\n    key: &quot;Index&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;begin_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;ellipsis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;end_mask&quot;\\n    value {\\n      i: 1\\n    }\\n  }\\n  attr {\\n    key: &quot;new_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;shrink_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;sample_shape_tensor_2/Const&quot;\\n  input: &quot;effect_departments/sample/strided_slice&quot;\\n  input: &quot;effect_departments/sample/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 2\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;Normal_2/sample/Reshape&quot;\\n  input: &quot;effect_departments/sample/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/DistributionShape/get_shape/DistributionShape/get_shape/ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/DistributionShape/get_shape/sample_ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/zero&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/sample_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/event_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 14\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/pick_vector/cond&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_BOOL\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_BOOL\\n        tensor_shape {\\n        }\\n        bool_val: false\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat/values_0&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: -1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat/values_0&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/batch_shape&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/event_shape&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 3\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;effect_departments/sample/Reshape&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/shift&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: -1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/assert_integer/statically_determined_was_integer&quot;\\n  op: &quot;NoOp&quot;\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/transpose/perm&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/transpose&quot;\\n  op: &quot;Transpose&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/Reshape&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/transpose/perm&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tperm&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/LinearOperatorScaledIdentity/matmul/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/rotate_transpose/transpose&quot;\\n  input: &quot;effect_departments/init/make_diag_scale/LinearOperatorScaledIdentity/ExpandDims_1&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/shift&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/assert_integer/statically_determined_was_integer&quot;\\n  op: &quot;NoOp&quot;\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/transpose/perm&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/transpose&quot;\\n  op: &quot;Transpose&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/LinearOperatorScaledIdentity/matmul/mul&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/transpose/perm&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tperm&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/DistributionShape/get_shape/DistributionShape/get_shape/ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 2\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/DistributionShape/get_shape/sample_ndims&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/zero&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/sample_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/event_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 14\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape/make_batch_of_event_sample_matrices/DistributionShape/get_shape/sample_shape&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/batch_shape&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/DistributionShape/get_shape/event_shape&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 3\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/rotate_transpose/transpose&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;effect_departments/sample/affine_linear_operator/forward/add&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/DistributionShape_1/undo_make_batch_of_event_sample_matrices/Reshape&quot;\\n  input: &quot;zeros_4&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;mul/y&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n          dim {\\n            size: 58737\\n          }\\n        }\\n        tensor_content: &quot;<stripped 234948 bytes>&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;effect_service/read&quot;\\n  input: &quot;mul/y&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;GatherV2/indices&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 58737\\n          }\\n        }\\n        tensor_content: &quot;<stripped 234948 bytes>&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;GatherV2/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;GatherV2&quot;\\n  op: &quot;GatherV2&quot;\\n  input: &quot;effect_students/sample/affine_linear_operator/forward/add&quot;\\n  input: &quot;GatherV2/indices&quot;\\n  input: &quot;GatherV2/axis&quot;\\n  attr {\\n    key: &quot;Taxis&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tindices&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tparams&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;add&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;mul&quot;\\n  input: &quot;GatherV2&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;GatherV2_1/indices&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 58737\\n          }\\n        }\\n        tensor_content: &quot;<stripped 234948 bytes>&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;GatherV2_1/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;GatherV2_1&quot;\\n  op: &quot;GatherV2&quot;\\n  input: &quot;effect_instructors/sample/affine_linear_operator/forward/add&quot;\\n  input: &quot;GatherV2_1/indices&quot;\\n  input: &quot;GatherV2_1/axis&quot;\\n  attr {\\n    key: &quot;Taxis&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tindices&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tparams&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;add_1&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;add&quot;\\n  input: &quot;GatherV2_1&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;GatherV2_2/indices&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 58737\\n          }\\n        }\\n        tensor_content: &quot;<stripped 234948 bytes>&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;GatherV2_2/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;GatherV2_2&quot;\\n  op: &quot;GatherV2&quot;\\n  input: &quot;effect_departments/sample/affine_linear_operator/forward/add&quot;\\n  input: &quot;GatherV2_2/indices&quot;\\n  input: &quot;GatherV2_2/axis&quot;\\n  attr {\\n    key: &quot;Taxis&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tindices&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tparams&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;add_2&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;add_1&quot;\\n  input: &quot;GatherV2_2&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;add_3&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;add_2&quot;\\n  input: &quot;intercept/read&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/loc&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;add_3&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/scale/input&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/scale&quot;\\n  op: &quot;Identity&quot;\\n  input: &quot;ratings/scale/input&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;sample_shape_tensor_3/Const&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/batch_shape_tensor/batch_shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 58737\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/concat/values_0&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/concat/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/concat&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;ratings/sample/concat/values_0&quot;\\n  input: &quot;ratings/batch_shape_tensor/batch_shape&quot;\\n  input: &quot;ratings/sample/concat/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 2\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/random_normal/mean&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 0.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/random_normal/stddev&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_FLOAT\\n        tensor_shape {\\n        }\\n        float_val: 1.0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/random_normal/RandomStandardNormal&quot;\\n  op: &quot;RandomStandardNormal&quot;\\n  input: &quot;ratings/sample/concat&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;seed&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;seed2&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/random_normal/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;ratings/sample/random_normal/RandomStandardNormal&quot;\\n  input: &quot;ratings/sample/random_normal/stddev&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/random_normal&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;ratings/sample/random_normal/mul&quot;\\n  input: &quot;ratings/sample/random_normal/mean&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/mul&quot;\\n  op: &quot;Mul&quot;\\n  input: &quot;ratings/sample/random_normal&quot;\\n  input: &quot;ratings/scale&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/add&quot;\\n  op: &quot;Add&quot;\\n  input: &quot;ratings/sample/mul&quot;\\n  input: &quot;ratings/loc&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/Shape&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 2\\n          }\\n        }\\n        tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000q\\\\345\\\\000\\\\000&quot;\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/strided_slice/stack&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/strided_slice/stack_1&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/strided_slice/stack_2&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n          dim {\\n            size: 1\\n          }\\n        }\\n        int_val: 1\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/strided_slice&quot;\\n  op: &quot;StridedSlice&quot;\\n  input: &quot;ratings/sample/Shape&quot;\\n  input: &quot;ratings/sample/strided_slice/stack&quot;\\n  input: &quot;ratings/sample/strided_slice/stack_1&quot;\\n  input: &quot;ratings/sample/strided_slice/stack_2&quot;\\n  attr {\\n    key: &quot;Index&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;begin_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;ellipsis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;end_mask&quot;\\n    value {\\n      i: 1\\n    }\\n  }\\n  attr {\\n    key: &quot;new_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n  attr {\\n    key: &quot;shrink_axis_mask&quot;\\n    value {\\n      i: 0\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/concat_1/axis&quot;\\n  op: &quot;Const&quot;\\n  attr {\\n    key: &quot;dtype&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;value&quot;\\n    value {\\n      tensor {\\n        dtype: DT_INT32\\n        tensor_shape {\\n        }\\n        int_val: 0\\n      }\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/concat_1&quot;\\n  op: &quot;ConcatV2&quot;\\n  input: &quot;sample_shape_tensor_3/Const&quot;\\n  input: &quot;ratings/sample/strided_slice&quot;\\n  input: &quot;ratings/sample/concat_1/axis&quot;\\n  attr {\\n    key: &quot;N&quot;\\n    value {\\n      i: 2\\n    }\\n  }\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n  attr {\\n    key: &quot;Tidx&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\nnode {\\n  name: &quot;ratings/sample/Reshape&quot;\\n  op: &quot;Reshape&quot;\\n  input: &quot;ratings/sample/add&quot;\\n  input: &quot;ratings/sample/concat_1&quot;\\n  attr {\\n    key: &quot;T&quot;\\n    value {\\n      type: DT_FLOAT\\n    }\\n  }\\n  attr {\\n    key: &quot;Tshape&quot;\\n    value {\\n      type: DT_INT32\\n    }\\n  }\\n}\\n';\n",
              "        }\n",
              "      </script>\n",
              "      <link rel=&quot;import&quot; href=&quot;https://tensorboard.appspot.com/tf-graph-basic.build.html&quot; onload=load()>\n",
              "      <div style=&quot;height:600px&quot;>\n",
              "        <tf-graph-basic id=&quot;graph0.34529891728490614&quot;></tf-graph-basic>\n",
              "      </div>\n",
              "  \"></iframe>\n",
              "  "
            ],
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "ZPZTWsCeB7Va",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Parameter Estimation\n",
        "\n",
        "Given data, the goal of inference is to fit the model's fixed effects slope $\\beta$, intercept $\\alpha$, and variance component parameter $\\sigma^2$. The maximum likelihood principle formalizes this task as\n",
        "\n",
        "$$\n",
        "\\max_{\\beta, \\alpha, \\sigma}~\\log p(\\mathbf{y}\\mid \\mathbf{X}, \\mathbf{Z}; \\beta, \\alpha, \\sigma) = \\max_{\\beta, \\alpha, \\sigma}~\\log \\int p(\\eta; \\sigma) ~p(\\mathbf{y}\\mid \\mathbf{X}, \\mathbf{Z}, \\eta; \\beta, \\alpha)~d\\eta.\n",
        "$$\n",
        "\n",
        "In this tutorial, we use the Monte Carlo EM algorithm to maximize this marginal density (Dempster et al., 1977; Wei and Tanner, 1990).¹ We perform Markov chain Monte Carlo to compute the expectation of the conditional likelihood with respect to the random effects (\"E-step\"), and we perform gradient descent to maximize the expectation with respect to the parameters (\"M-step\"):\n",
        "\n",
        "+ For the E-step, we set up Hamiltonian Monte Carlo (HMC). It takes a current state—the student, instructor, and department effects—and returns a new state. We assign the new state to TensorFlow variables, which will denote the state of the HMC chain.\n",
        "\n",
        "+ For the M-step, we use the posterior sample from HMC to calculate an unbiased estimate of the marginal likelihood up to a constant. We then apply its gradient with respect to the parameters of interest. This produces an unbiased stochastic descent step on the marginal likelihood. We implement it with the Adam TensorFlow optimizer and minimize the negative of the marginal."
      ]
    },
    {
      "metadata": {
        "id": "F7uOcwQFB7Vb",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "log_joint = ed.make_log_joint_fn(model_template)\n",
        "\n",
        "def target_log_prob_fn(effect_students, effect_instructors, effect_departments):\n",
        "  \"\"\"Unnormalized target density as a function of states.\"\"\"\n",
        "  return log_joint(  # fix `features` and `ratings` to the training data\n",
        "    features=features_train,\n",
        "    effect_students=effect_students,\n",
        "    effect_instructors=effect_instructors,\n",
        "    effect_departments=effect_departments,\n",
        "    ratings=labels_train)\n",
        "\n",
        "tf.reset_default_graph()\n",
        "\n",
        "# Set up E-step (MCMC).\n",
        "effect_students = tf.get_variable(  # `trainable=False` so unaffected by M-step\n",
        "    \"effect_students\", [num_students], trainable=False)\n",
        "effect_instructors = tf.get_variable(\n",
        "    \"effect_instructors\", [num_instructors], trainable=False)\n",
        "effect_departments = tf.get_variable(\n",
        "    \"effect_departments\", [num_departments], trainable=False)\n",
        "\n",
        "hmc = tfp.mcmc.HamiltonianMonteCarlo(\n",
        "    target_log_prob_fn=target_log_prob_fn,\n",
        "    step_size=0.015,\n",
        "    num_leapfrog_steps=3)\n",
        "\n",
        "current_state = [effect_students, effect_instructors, effect_departments]\n",
        "next_state, kernel_results = hmc.one_step(\n",
        "      current_state=current_state,\n",
        "      previous_kernel_results=hmc.bootstrap_results(current_state))\n",
        "\n",
        "expectation_update = tf.group(\n",
        "    effect_students.assign(next_state[0]),\n",
        "    effect_instructors.assign(next_state[1]),\n",
        "    effect_departments.assign(next_state[2]))\n",
        "\n",
        "# Set up M-step (gradient descent).\n",
        "# The following should work. However, TensorFlow raises an error about taking\n",
        "# gradients through IndexedSlices tensors. This may be a TF bug. For now,\n",
        "# we recompute the target's log probability at the current state.\n",
        "# loss = -kernel_results.accepted_results.target_log_prob\n",
        "with tf.control_dependencies([expectation_update]):\n",
        "  loss = -target_log_prob_fn(effect_students,\n",
        "                             effect_instructors,\n",
        "                             effect_departments)\n",
        "  optimizer = tf.train.AdamOptimizer(learning_rate=0.01)\n",
        "  minimization_update = optimizer.minimize(loss)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "6BaHczzpkt0k",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "We perform a warm-up stage, which runs one MCMC chain for a number of iterations so that training may be initialized within the posterior's probability mass. We then run a training loop. It jointly runs the E and M-steps and records values during training."
      ]
    },
    {
      "metadata": {
        "id": "zxbcYtrUt3OG",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 136
        },
        "outputId": "a95a528c-1e3a-4d28-f2a2-d8dea1af9cc2"
      },
      "cell_type": "code",
      "source": [
        "init = tf.global_variables_initializer()\n",
        "\n",
        "num_warmup_iters = 1000\n",
        "num_iters = 1500\n",
        "num_accepted = 0\n",
        "effect_students_samples = np.zeros([num_iters, num_students])\n",
        "effect_instructors_samples = np.zeros([num_iters, num_instructors])\n",
        "effect_departments_samples = np.zeros([num_iters, num_departments])\n",
        "loss_history = np.zeros([num_iters])\n",
        "\n",
        "sess = tf.Session()\n",
        "sess.run(init)\n",
        "\n",
        "# Run warm-up stage.\n",
        "for t in range(num_warmup_iters):\n",
        "  _, is_accepted_val = sess.run(\n",
        "      [expectation_update, kernel_results.is_accepted])\n",
        "  num_accepted += is_accepted_val\n",
        "  if t % 500 == 0 or t == num_warmup_iters - 1:\n",
        "    print(\"Warm-Up Iteration: {:>3} Acceptance Rate: {:.3f}\".format(\n",
        "        t, num_accepted / (t + 1)))\n",
        "\n",
        "num_accepted = 0  # reset acceptance rate counter\n",
        "\n",
        "# Run training.\n",
        "for t in range(num_iters):\n",
        "  for _ in range(5):  # run 5 MCMC iterations before every joint EM update\n",
        "    _ = sess.run(expectation_update)\n",
        "  [\n",
        "      _,\n",
        "      _,\n",
        "      effect_students_val,\n",
        "      effect_instructors_val,\n",
        "      effect_departments_val,\n",
        "      is_accepted_val,\n",
        "      loss_val,\n",
        "  ] = sess.run([\n",
        "      expectation_update,\n",
        "      minimization_update,\n",
        "      effect_students,\n",
        "      effect_instructors,\n",
        "      effect_departments,\n",
        "      kernel_results.is_accepted,\n",
        "      loss,\n",
        "  ])\n",
        "  effect_students_samples[t, :] = effect_students_val\n",
        "  effect_instructors_samples[t, :] = effect_instructors_val\n",
        "  effect_departments_samples[t, :] = effect_departments_val\n",
        "  num_accepted += is_accepted_val\n",
        "  loss_history[t] = loss_val\n",
        "  if t % 500 == 0 or t == num_iters - 1:\n",
        "    print(\"Iteration: {:>4} Acceptance Rate: {:.3f} Loss: {:.3f}\".format(\n",
        "        t, num_accepted / (t + 1), loss_val))"
      ],
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Warm-Up Iteration:   0 Acceptance Rate: 1.000\n",
            "Warm-Up Iteration: 500 Acceptance Rate: 0.806\n",
            "Warm-Up Iteration: 999 Acceptance Rate: 0.736\n",
            "Iteration:    0 Acceptance Rate: 1.000 Loss: 103901.820\n",
            "Iteration:  500 Acceptance Rate: 0.647 Loss: 96190.906\n",
            "Iteration: 1000 Acceptance Rate: 0.671 Loss: 96115.094\n",
            "Iteration: 1499 Acceptance Rate: 0.674 Loss: 96050.664\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "r6U2zkdbHj5z",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Above, we did not run the algorithm until a convergence threshold was detected. To check whether training was sensible, we verify that the loss function indeed tends to converge over training iterations."
      ]
    },
    {
      "metadata": {
        "id": "HR4A6FLCwD7b",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 281
        },
        "outputId": "63007bfe-6a75-401d-b977-f905a0327203"
      },
      "cell_type": "code",
      "source": [
        "plt.plot(loss_history)\n",
        "plt.ylabel(r'Loss $-\\log$ $p(y\\mid\\mathbf{x})$')\n",
        "plt.xlabel('Iteration')\n",
        "plt.show()"
      ],
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nzJ07l507d2Kz2Rg3bhz79+/ntddew2az0aFDBx588EEiIyNZvHgxq1ev9s+wmZmZSV1dHTNmzKCu\nro7w8HAmTJhAZGQkhYWFvPbaaxiGQUZGBmPGnJ/3A1NxCdBnAGwqRBd8ikobZHYkIYQAWllohg4d\nSq9evSgsLOTAgQP06dOHsWPHUllZedZB1q5dS11dHU8//TTl5eW8/PLLuN1uxo8fT2JiIm+//TbL\nli1j2LBhrFq1imnTplFXV8cTTzxBeno6S5YsoX///lx77bUsW7aMd999lzvvvJP58+fz+OOPExMT\nw9SpU7nkkkvO2+t+jAlT8d5/A3rHNrOjCCGEX6uazgBiY2O58soruf7667niiiuIiYnhhRfOvl9g\nz549/mtzEhISqKyspFOnTtTU1ABQW1tL586dKS4uJiMjA5vNht1uJy4ujrKyMoqLixkyZAgAgwYN\noqioiL179xIZGUlsbKz/jKao6PydkVLZbBCfBDu2or/eaHYcIYQAWnlGE0xOp5MlS5YwevRoysvL\nqaio4O6772b69Ol06tSJyMhIbr/9dt577z3sdrt/O7vdTnV1NW632788KioKt9vdZNmx5S29L1tz\nc18He9uz5UofQu2H79Bxw6fEXPHDZtczM2NLWD0fSMZAsHo+sH5Gq+cDCxWajIwMSkpKmDJlCk6n\nk6SkJN566y1+/etf06dPH/Ly8vjwww9P2E5r3aJlp1p+Mrt37255+OMkJiae8baBoK+7Az58h9oV\n/49DY+5GGSeetJqd8XSsng8kYyBYPR9YP6PV8jVX9FpUaFwu1ylf93q9rU90Erfeeqv/cU5ODlVV\nVfTp47th5IABA1i5ciWpqalNPtjq6mocDgcOhwO3201ERAQul6vJsuOP43y/sFSFhqEu+QE6fwXe\ne69H/eJXGMOuNDuWEKIda1Ghuf/++4Odg9LSUpYuXUp2djYbNmygR48e7N69m7KyMpKTk9m6dSsJ\nCQmkpqby/vvvc/PNN3PgwAFcLhfJyckMGDCA1atXc+ONN/LZZ5+Rnp5O165dOXToEBUVFXTp0oWC\nggJycnKCfixmU9ffiS5YBYcPo/NmghQaIYSJWlRoXn/99WDnwOl0orVm0qRJhIWFkZOTw759+3jx\nxRcJCQkhMjKS+++/n06dOjFixAimTJkCwNixYzEMg6uvvprnnnuOJ554goiICMaPH+9/fcaMGYBv\n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\nB8of4w2re+zdAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f7b75264160>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "Fz7FphO9LwVE",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "We also use a trace plot, which shows the Markov chain Monte Carlo algorithm's trajectory across specific latent dimensions. Below we see that specific instructor effects indeed meaningfully transition away from their initial state and explore the state space. The trace plot also indicates that the effects differ across instructors but with similar mixing behavior."
      ]
    },
    {
      "metadata": {
        "id": "_NvaIhgrvY9o",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 281
        },
        "outputId": "0684783c-dded-49e8-dab8-03f7c2f981b8"
      },
      "cell_type": "code",
      "source": [
        "for i in range(7):\n",
        "  plt.plot(effect_instructors_samples[:, i])\n",
        "\n",
        "plt.legend([i for i in range(7)], loc='lower right')\n",
        "plt.ylabel('Instructor Effects')\n",
        "plt.xlabel('Iteration')\n",
        "plt.show()"
      ],
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nP+w8AmWKjwAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f7b6f0f0c18>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "-xVCGWZoB7Vd",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Criticism\n",
        "\n",
        "Above, we fitted the model. We now look into criticizing its fit using data, which lets us explore and better understand the model. One such technique is a residual plot, which plots the difference between the model's predictions and ground truth for each data point. If the model were correct, then their difference should be standard normally distributed; any deviations from this pattern in the plot indicate model misfit.\n",
        "\n",
        "We build the residual plot by first forming the posterior predictive distribution over ratings, which replaces the prior distribution on the random effects with its posterior given training data. In particular, we run the model forward and intercept its dependence on prior random effects with their inferred posterior means.²"
      ]
    },
    {
      "metadata": {
        "id": "p4vreJekB7Vf",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "def interceptor(rv_constructor, *rv_args, **rv_kwargs):\n",
        "  \"\"\"Replaces prior on effects with empirical posterior mean from MCMC.\"\"\"\n",
        "  name = rv_kwargs.pop(\"name\")\n",
        "  if name == \"effect_students\":\n",
        "    rv_kwargs[\"value\"] = np.mean(effect_students_samples, 0)\n",
        "  elif name == \"effect_instructors\":\n",
        "    rv_kwargs[\"value\"] = np.mean(effect_instructors_samples, 0)\n",
        "  elif name == \"effect_departments\":\n",
        "    rv_kwargs[\"value\"] = np.mean(effect_departments_samples, 0)\n",
        "  return rv_constructor(*rv_args, **rv_kwargs)\n",
        "\n",
        "with ed.interception(interceptor):\n",
        "  ratings_posterior = model_template(features=features_test)\n",
        "\n",
        "ratings_prediction = ratings_posterior.distribution.mean()"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "zTQJ3d-Hv93z",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Upon visual inspection, the residuals look somewhat standard-normally distributed. However, the fit is not perfect: there is larger probability mass in the tails than a normal distribution, which indicates the model might improve its fit by relaxing its normality assumptions.\n",
        "\n",
        "In particular, although it is most common to use a normal distribution to model ratings in the `InstEval` data set, a closer look at the data reveals that course evaluation ratings are in fact ordinal values from 1 to 5. This suggests that we should be using an ordinal distribution, or even Categorical if we have enough data to throw away the relative ordering. This is a one-line change to the Edward program above; the same inference code is applicable."
      ]
    },
    {
      "metadata": {
        "id": "0jIxfwuvEWLG",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 282
        },
        "outputId": "7a38946d-320e-4430-eb29-b90370168dc6"
      },
      "cell_type": "code",
      "source": [
        "ratings_pred = sess.run(ratings_prediction)\n",
        "plt.title(\"Residuals for Predicted Ratings on Test Set\")\n",
        "plt.xlim(-4, 4)\n",
        "plt.ylim(0, 800)\n",
        "plt.hist(ratings_pred - labels_test, 75)\n",
        "plt.show()"
      ],
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n/wBEjrJ2OwrDiwAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f7b7115f6d8>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "wi4hnI8UxFD2",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "To explore how the model makes individual predictions, we look at the histogram of effects for students, instructors, and departments. This lets us understand how individual elements in a data point's feature vector tends to influence the outcome.\n",
        "\n",
        "Not surprisingly, we see below that each student typically has little effect on an instructor's evaluation rating. Interestingly, we see that the department an instructor belongs to has a large effect."
      ]
    },
    {
      "metadata": {
        "id": "JY1p26-W8hVz",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "[\n",
        "    effect_students_mean,\n",
        "    effect_instructors_mean,\n",
        "    effect_departments_mean,\n",
        "] = sess.run([\n",
        "    tf.reduce_mean(effect_students_samples, 0),\n",
        "    tf.reduce_mean(effect_instructors_samples, 0),\n",
        "    tf.reduce_mean(effect_departments_samples, 0),\n",
        "])"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "MU-L604RFkxg",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 282
        },
        "outputId": "38e97dc2-8946-40ba-c487-7ec2673e3ea8"
      },
      "cell_type": "code",
      "source": [
        "plt.title(\"Histogram of Student Effects\")\n",
        "plt.hist(effect_students_mean, 75)\n",
        "plt.show()"
      ],
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nAElFTkSuQmCC\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f7b7117e940>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "22qgTW7SGulD",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 282
        },
        "outputId": "cbbf769e-db3b-4e78-8fb7-7fe4b560a6fc"
      },
      "cell_type": "code",
      "source": [
        "plt.title(\"Histogram of Instructor Effects\")\n",
        "plt.hist(effect_instructors_mean, 75)\n",
        "plt.show()"
      ],
      "execution_count": 18,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f7b6e4fc8d0>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "lTd2_uodGu2F",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 282
        },
        "outputId": "cc8ac028-0486-4041-e45a-ec0028ef94b8"
      },
      "cell_type": "code",
      "source": [
        "plt.title(\"Histogram of Department Effects\")\n",
        "plt.hist(effect_departments_mean, 75)\n",
        "plt.show()"
      ],
      "execution_count": 19,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nExEp0P8Dtzp2ExXHyeoAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f7b6e4a0400>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "Ck3cPwIjvyqO",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Footnotes\n",
        "\n",
        "¹ Linear mixed effect models are a special case where we can analytically compute its marginal density. For the purposes of this tutorial, we demonstrate Monte Carlo EM, which more readily applies to non-analytic marginal densities such as if the likelihood were extended to be Categorical instead of Normal.\n",
        "\n",
        "² For simplicity, we form the predictive distribution's mean using only one forward pass of the model. This is done by conditioning on the posterior mean and is valid for linear mixed effects models. However, this is not valid in general: the posterior predictive distribution's mean is typically intractable and requires taking the empirical mean across multiple forward passes of the model given posterior samples."
      ]
    },
    {
      "metadata": {
        "id": "8pm6qMKvB7WB",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Acknowledgments\n",
        "\n",
        "This tutorial was originally written in Edward 1.0 ([source](https://github.com/blei-lab/edward/blob/master/notebooks/linear_mixed_effects_models.ipynb)). We thank all contributors to writing and revising that version."
      ]
    },
    {
      "metadata": {
        "id": "sHw7WpM1IzLO",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## References\n",
        "\n",
        "1. Douglas Bates and Martin Machler and Ben Bolker and Steve Walker. Fitting Linear Mixed-Effects Models Using lme4. _Journal of Statistical Software_, 67(1):1-48, 2015.\n",
        "\n",
        "2. Arthur P. Dempster, Nan M. Laird, and Donald B. Rubin. Maximum likelihood from incomplete data via the EM algorithm. _Journal of the Royal Statistical Society, Series B (Methodological)_, 1-38, 1977.\n",
        "\n",
        "3. Andrew Gelman and Jennifer Hill. _Data analysis using regression and multilevel/hierarchical models._ Cambridge University Press, 2006.\n",
        "\n",
        "4. David A. Harville. Maximum likelihood approaches to variance component estimation and to related problems. _Journal of the American Statistical Association_, 72(358):320-338, 1977.\n",
        "\n",
        "5. Michael I. Jordan. An Introduction to Graphical Models. Technical Report, 2003.\n",
        "\n",
        "6. Nan M. Laird and James Ware. Random-effects models for longitudinal data. _Biometrics_, 963-974, 1982.\n",
        "\n",
        "7. Greg Wei and Martin A. Tanner. A Monte Carlo implementation of the EM algorithm and the poor man's data augmentation algorithms. _Journal of the American Statistical Association_, 699-704, 1990."
      ]
    }
  ]
}